package structs

import (
	"encoding/binary"
)

// PacketHeader 协议包头
type PacketHeader struct {
	length  uint32 // 数据包长度
	command uint32 // 命令类型
	status  uint32 // 状态
	channel uint32 // 通道号
	time    uint32 // 时间
	date    uint32 // 日期
	ident   uint32 // 序号
	level   uint32 // 标识
}

// 构造函数
func NewPacketHeader(length, command, status, channel, time, date, ident, level uint32) PacketHeader {
	return PacketHeader{
		length:  length,
		command: command,
		status:  status,
		channel: channel,
		time:    time,
		date:    date,
		ident:   ident,
		level:   level,
	}
}

// 包头struct → [32]byte
func (h *PacketHeader) ToBytes() ([]byte, error) {
	// 创建一个32字节的切片来存储包头
	bytes := make([]byte, 32)
	// 将包头字段转换为字节并存储到切片中
	binary.LittleEndian.PutUint32(bytes[0:4], h.length)
	binary.LittleEndian.PutUint32(bytes[4:8], h.command)
	binary.LittleEndian.PutUint32(bytes[8:12], h.status)
	binary.LittleEndian.PutUint32(bytes[12:16], h.channel)
	binary.LittleEndian.PutUint32(bytes[16:20], h.time)
	binary.LittleEndian.PutUint32(bytes[20:24], h.date)
	binary.LittleEndian.PutUint32(bytes[24:28], h.ident)
	binary.LittleEndian.PutUint32(bytes[28:32], h.level)
	return bytes, nil
}

// ParseHeader 从字节数组中解析包头,转化为对应的packetHeader结构体
func ParseHeader(data []byte) (*PacketHeader, error) {
	header := &PacketHeader{
		length:  binary.LittleEndian.Uint32(data[0:4]),
		command: binary.LittleEndian.Uint32(data[4:8]),
		status:  binary.LittleEndian.Uint32(data[8:12]),
		channel: binary.LittleEndian.Uint32(data[12:16]),
		time:    binary.LittleEndian.Uint32(data[16:20]),
		date:    binary.LittleEndian.Uint32(data[20:24]),
		ident:   binary.LittleEndian.Uint32(data[24:28]),
		level:   binary.LittleEndian.Uint32(data[28:32]),
	}
	return header, nil
}

func AnchorHeader(bytes []byte) bool {
	var flag = false
	data := binary.LittleEndian.Uint32(bytes[:])
	switch data {
	case 0x2002:
		flag = true
	}
	return flag
}

// GetLength 返回 packetHeader 的 command 字段
func (h *PacketHeader) GetLength() uint32 {
	return h.length
}

// SetLength 设置 packetHeader 的 length 字段
func (h *PacketHeader) SetLength(value uint32) {
	h.length = value
}

// GetCommand 返回 packetHeader 的 command 字段
func (h *PacketHeader) GetCommand() uint32 {
	return h.command
}

// SetCommand 设置 packetHeader 的 command 字段
func (h *PacketHeader) SetCommand(value uint32) {
	h.command = value
}

// GetStatus 返回 packetHeader 的 status 字段
func (h *PacketHeader) GetStatus() uint32 {
	return h.status
}

// SetStatus 设置 packetHeader 的 status 字段
func (h *PacketHeader) SetStatus(value uint32) {
	h.status = value
}

// GetChannel 返回 packetHeader 的 channel 字段
func (h *PacketHeader) GetChannel() uint32 {
	return h.channel
}

// SetChannel 设置 packetHeader 的 channel 字段
func (h *PacketHeader) SetChannel(value uint32) {
	h.channel = value
}

// GetTime 返回 packetHeader 的 time 字段
func (h *PacketHeader) GetTime() uint32 {
	return h.time
}

// SetTime 设置 packetHeader 的 time 字段
func (h *PacketHeader) SetTime(value uint32) {
	h.time = value
}

// GetDate 返回 packetHeader 的 date 字段
func (h *PacketHeader) GetDate() uint32 {
	return h.date
}

// SetDate 设置 packetHeader 的 date 字段
func (h *PacketHeader) SetDate(value uint32) {
	h.date = value
}

// GetIdent 返回 packetHeader 的 ident 字段
func (h *PacketHeader) GetIdent() uint32 {
	return h.ident
}

// SetIdent 设置 packetHeader 的 ident 字段
func (h *PacketHeader) SetIdent(value uint32) {
	h.ident = value
}

// GetLevel 返回 packetHeader 的 level 字段
func (h *PacketHeader) GetLevel() uint32 {
	return h.level
}

// SetLevel 设置 packetHeader 的 level 字段
func (h *PacketHeader) SetLevel(value uint32) {
	h.level = value
}
